'use client';
import { Price, Button, LoaderSpinner, Link } from '@theme/components';
import { Image } from '@akinon/next/components/image';
import clsx from 'clsx';
import { SalesContractModal } from '@theme/views/sales-contract-modal';
import { useGetOrderQuery } from '@akinon/next/data/client/account';
import { useEffect, useState } from 'react';
import { useParams } from 'next/navigation';
import { OrderDetailHeader } from '@theme/views/account/orders/order-detail-header';
import { ROUTES } from '@theme/routes';
import { useLocalization } from '@akinon/next/hooks';
import settings from 'settings';
import { getOrderStatus } from 'utils';
const AccountOrderDetail = () => {
const { id } = useParams<{ id: string }>();
const { locale, t } = useLocalization();
const localeValue = settings.localization.locales.find(
(locale_) => locale_.value === locale
).apiValue;
const {
data: order,
isLoading,
isSuccess,
isFetching
} = useGetOrderQuery(id);
const [orderDate, setOrderDate] = useState('');
const groupedOrder = [];
if (order) {
const groupedData =
order?.orderitem_set?.reduce((groups, item) => {
const { tracking_number } = item;
if (!groups[tracking_number]) {
groups[tracking_number] = [];
}
groups[tracking_number].push(item);
return groups;
}, {}) || {};
const result = Object.values(groupedData);
groupedOrder.push(...result);
}
useEffect(() => {
if (isSuccess) {
const shortDate = new Date(order.created_date).toLocaleDateString(
localeValue,
{
day: 'numeric',
month: 'long',
year: 'numeric'
}
);
setOrderDate(shortDate);
}
}, [order, isSuccess, localeValue]);
if (isLoading && isFetching) {
return (
);
}
if (!order) {
return (
{t('account.my_orders.detail.no_orders_found')}
);
}
return (
{t('account.my_orders.detail.order_date')}: {orderDate}
{order?.orderitem_set?.length}{' '}
{t('account.my_orders.detail.products')} {groupedOrder?.length}{' '}
{t('account.my_orders.detail.packages')}
{t('account.my_orders.detail.delivery_address')}:{' '}
{order?.shipping_address?.line}{' '}
{order?.shipping_address?.district?.name}{' '}
{order?.shipping_address?.township?.name}{' '}
{order?.shipping_address?.city?.name}
{groupedOrder.map((group, i) => {
const orderStatus = getOrderStatus(
group[0]?.status?.value?.toString(),
t
);
return (
{t('account.my_orders.detail.package_no')}: {i + 1}
({group.length}{' '}
{t('account.my_orders.detail.items')})
{orderStatus.label}
{group[0]?.tracking_number && group[0]?.tracking_url && (
)}
{group.map((item, index) => {
const itemStatus = getOrderStatus(
item?.status?.value?.toString(),
t
);
return (
{item?.product?.name}
{item?.product?.attributes?.filterable_color && (
{t('account.my_orders.detail.color')}
: {item?.product?.attributes?.filterable_color}
)}
{item?.product?.attributes?.size && (
{t('account.my_orders.detail.size')}
:{item?.product?.attributes?.size}
)}
{t('account.my_orders.detail.code')}:{' '}
{item?.product?.base_code}
{itemStatus.label}
{(item?.is_cancellable || item?.is_refundable) &&
order?.is_cancellable && (
)}
{parseFloat(item?.retail_price || '0') >
parseFloat(item?.price || '0') && (
)}
parseFloat(item?.price || '0')
})}
value={item?.price}
/>
);
})}
{group.map((item) =>
item.cancellationrequest_set?.map((cancellationItem) => {
const status = cancellationItem.status?.value;
const isRejected = status === 'rejected';
const isCompleted = status === 'completed';
const filteredImages =
cancellationItem.cancellation_request_image_set?.filter(
(img) =>
isRejected
? !img.is_uploaded_by_user
: isCompleted
? img.is_uploaded_by_user
: false
) || [];
const statusText = isRejected
? t('account.my_orders.return.rejected')
: isCompleted
? t('account.my_orders.return.completed')
: null;
if (!statusText || filteredImages.length === 0) return null;
return (
{t('account.my_orders.return.return_status')}
{statusText}
{filteredImages.map((img) => (
{img.description && (
{t('account.my_orders.return.explanation')}:
{img.description}
)}
))}
);
})
)}
);
})}
{t('account.my_orders.detail.subtotal')} (
{order?.orderitem_set?.length}{' '}
{t('account.my_orders.detail.items')})
{order?.discountitem_set &&
order?.discountitem_set?.map((item, index) => (
))}
{t('account.my_orders.detail.total')}
);
};
export default AccountOrderDetail;